package com.wtwd.device.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wtwd.device.model.entity.*;
import com.wtwd.device.model.vo.GetGroupDialVo;
import com.wtwd.device.model.vo.UploadFileVO;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author zdl
 * @since 2023-01-03
 */
public interface GroupInfoService {

    /**
     * 客户id为0默认查人所有的分组
     *
     * @param customerId
     * @param name
     * @param page
     * @return
     */
    IPage<GroupInfo> getGroupInfoByConditionPage(Long customerId, String name, Page<GroupInfo> page);

    /**
     * 添加分组
     * 鉴别分组名称是否存在
     * 添加时自动生成序号
     *
     * @param groupName
     * @param customerId
     * @param path
     * @return
     */
    AddGroupInfoCode addGroupInfo(String groupName, Long customerId, String path);


    /**
     * 读取导入分组名称的excel文件
     *
     * @param path
     * @return
     */
    List<ExcelImportGroupLanguage> readExcelFile(String path);

    /**
     * 获取 MultipartFile 文件
     *
     * @param path
     * @return
     */
    MultipartFile getMultipartFile(String path);


    /**
     * 一个客户之间的分组名称唯一
     *
     * @param customerId
     * @param groupName
     * @param groupId
     * @param isExclude(是否排除本身这个分组)
     * @return
     */
    boolean authGroupNameExist(Long customerId, String groupName, Integer groupId, boolean isExclude);


    /**
     * 获取分组名称
     * 管理员获取可能是多个
     *
     * @param customerId
     * @param groupName
     * @return
     */
    List<GroupInfo> getGroupInfoByCustomerIdAndGroupName(Long customerId, String groupName);

    /**
     * 获取规则
     * 取客户分组中循序最大的加一
     * 问题：
     * 如果客户删除分组，并不会自己填充补位，但是并不影响排列顺序的问题故占不考虑
     *
     * @param customerId
     * @return
     */
    int getGroupSequence(Long customerId);


    /**
     * 根据客户id获取客户所有分组
     *
     * @param customerId
     * @return
     */
    List<GroupInfo> getGroupInfoByCustomerId(Long customerId);

    /**
     * 删除分组
     * 删除分组的同时删除该分组和表盘之间的关联关系
     *
     * @param groupInfoId
     * @return
     */
    Boolean deleteGroup(Integer groupInfoId);

    /**
     * 切换客户创建的分组排序
     * <p>
     * 切换规则
     * 切换到已经存在的位置，则对调分组位置
     * 如果不存在该位置则直切切换到该位置
     *
     * @param groupId
     * @param sequence
     * @param customerId
     * @return
     */
    boolean switchingSort(Integer groupId, Integer sequence, Long customerId);

    /**
     * 根据客户id以及顺序获取唯一一组分组
     *
     * @param sequence
     * @param customerId
     * @return
     */
    GroupInfo getGroupInfoByCustomerIdAndSequence(Integer sequence, Long customerId);

    /**
     * 更新分组开关
     *
     * @param groupId
     * @param sequence
     * @return
     */
    boolean updateGroupSequence(Integer groupId, Integer sequence);

    /**
     * 批量添加分组表盘
     *
     * @param groupIds
     * @param groupDialDtos
     * @return
     */
    boolean bathAddGroupDial(List<Integer> groupIds, List<GroupDialDto> groupDialDtos);

    /**
     * 分页获取分组表盘
     *
     * @param groupId
     * @param dialName
     * @param watchId
     * @param page
     * @return
     */
    IPage<GetGroupDialVo> getGroupDialPage(Integer groupId, String dialName, String watchId, Page<GroupInfo> page);

    /**
     * 根据手表id获取分组信息
     *
     * @param watchId
     * @return
     */
    List<GroupInfo> getGroupInfoByWatchId(String watchId, String type);

    /**
     * 获取分组翻译之后的语言
     *
     * @param groupInfos
     * @return
     */
    List<GroupInfo> geTranslationLanguage(List<GroupInfo> groupInfos, String type);

    /**
     * 根据分组id,手表id获取表盘数据，并且分页
     *
     * @param groupId
     * @param watchId
     * @param currentPage
     * @param pageSize
     * @return
     */
    List<DialManagement> getDialByWatchIdAndGroupIdPage(Integer groupId, String watchId, int currentPage, int pageSize);

    /**
     * 根据分组id集合和手表id获取表盘信息
     *
     * @param groupIds
     * @param watchId
     * @return
     */
    List<GetGroupIdAndDialByGroupIds> getGroupIdAndDialByGroupIds(List<Integer> groupIds, String watchId);

    /**
     * 根据分组主键id修改分组名称
     *
     * @param groupId
     * @param name
     * @param path
     * @return
     */
    boolean updateGroupName(Integer groupId, String name, String path, long customerId);


    /**
     * 上传文件并返回文件的相对路径
     * 全路径请根据情况拼接
     *
     * @param file
     * @return
     */
    UploadFileVO uploadPortrait(MultipartFile file);

    /**
     * 对比当前wathIds和数据库已经存在的watchs数据是否发生变化
     * 如果发生变化则做分组表盘的同步操作
     *
     * @param dialId
     * @param currentWatchIds
     * @return
     */
    boolean synchronizationGroupDial(Integer dialId, List<String> currentWatchIds);


    /**
     * 对比新旧集合
     * 返回新增数据集合，以及删除数据集合
     *
     * @param oldList
     * @param newList
     * @return
     */
    ContrastList contrastListGetAddDateAndDeleteDate(List<String> oldList, List<String> newList);

    /**
     * 根据表盘id获取分组信息
     *
     * @param dialId
     * @return
     */
    List<GroupInfo> getGroupInfoByDialId(Integer dialId);
}
